//
//  Connection.m
//  Truffle
//
//  Created by Jean-Pierre Lozi on 06/03/10.
//  Copyright 2010 isrtream1-svn . All rights reserved.
//

#import "GatewayConnection.h"
#import "LoadAndSaveCoupons.h"
#import "RestConnection.h"
#import "DAOTruffle.h"

NSData * tokenDev = nil;

@implementation GatewayConnection
@synthesize gatewayURL, position, token, longitude, latitude;


// Fonction permettant de se connecter à une passerelle.
- (int)connect
{
	// On récupère l'UUID.
	NSString *identifier = [[UIDevice currentDevice] uniqueIdentifier];
	
	// On crée la requête.
	//NSString *requestString = [NSString stringWithFormat:@"%@/iphone/connect/?id=%@&pseudo=%@&position=%@&token=%@", gatewayURL, identifier, [self nickname], [self position], [self token]];
	NSString *requestString = [NSString stringWithFormat:@"%@/iphone/connect/", gatewayURL];
	
	NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:requestString]
												        cachePolicy:NSURLRequestUseProtocolCachePolicy
												        timeoutInterval:15.0];
	[request setURL:[NSURL URLWithString:requestString]];
	
	// On utilise POST.
	[request setHTTPMethod:@"POST"];
	
	self.token = (NSString *)tokenDev;
	
	// On crée le contenu pour le POST.
	//NSString *post = [NSString stringWithFormat:@"id=%@&pseudo=%@&latitude=%@&longitude=%@&status=%@&token=%@", 
		//			  gatewayURL, identifier, [self nickname], [self position], @"Disponible", [self token]];
	
	//NSString *post = [NSString stringWithFormat:@"id=%@&pseudo=ISO&latitude=20.000&longitude=24.89&status=dispo&token=10135455442", identifier];
	DAOTruffle * dao = [[DAOTruffle alloc] init];
	NSString *user = [[dao getInfoSelf] objectForKey:@"pseudo"];
	NSLog(@"[GatewayConnection] Username : %@", user);
	if (user == nil) {
		user=@"Truffle_User";
	}
	NSString *status = [[dao getInfoSelf] objectForKey:@"status"];
	NSLog(@"[GatewayConnection] Status %@", status);
	if (status == nil) {
		status=@"Disponible";
	}
	
	[dao release];
	
	NSLog(@"[GatewayConnection] Status %@",  latitude);

	
	NSString *post = [NSString stringWithFormat:@"id=%@&pseudo=%@&latitude=%@&longitude=%@&status=%@&token=10135455442",identifier, user, latitude, longitude, status];
	
	NSLog(@"[GatewayConnection] Requête de connexion : %@", post);
	
	NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
	NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
	
	// On initialise les headers.
	[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
	[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
	
	// On remplit le body.
	[request setHTTPBody:postData];

	// On lance la connexion.
	NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
	
	// On exécute la requête.
	NSHTTPURLResponse *urlResponse = nil;
	NSError *error = [[NSError alloc] init];
	
	NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];  
	
	// On récupère le résultat.
	NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
	
	[connection release];
	[error release];
	NSLog(@"[GatewayConnection] init %@", result);
	
	
	// A-t-on pu se connecter?
	if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) 
    {
		// FIXME : debug
		NSLog(@"[GatewayConnection] Requête de connexion effectuée. Résultat : %@", result);
		
		// FIXME : à améliorer, on ne devrait pas faire de présuppositions sur la typographie, espaces, etc.
		if ([result isEqualToString:@"OK"])
		{
			// Tout s'est bien passé.
			[result release];
			
			return 0;
		}
		
		// Sinon, un problème est survenu.
		[result release];
		
		// TODO : vérifier que les données reçues sont bonnes.
		return -1;
	} 
    else 
    {
		[result release];
		
        // Une erreur est survenue.
		return -1;
    }
	
	[result release];
	
	// Tout s'est bien passé.
	return 0;
}

// Fonction permettant de se déconnecter d'une passerelle.
- (int)disconnect
{

	// On récupère l'UUID.
	NSString *identifier = [[UIDevice currentDevice] uniqueIdentifier];
	
	// On crée la requête.
	NSString *requestString = [NSString stringWithFormat:@"%@/iphone/disconnect?id=%@", gatewayURL, identifier];
	
	NSLog(@"[GatewayConnection] Requête : %@", requestString);
	
	NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:requestString]
														cachePolicy:NSURLRequestUseProtocolCachePolicy
													    timeoutInterval:15.0];
	[request setURL:[NSURL URLWithString:requestString]];
	
	// On utilise GET.
	[request setHTTPMethod:@"GET"];
	
	// On lance la connexion.
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
	
	// On exécute la requête.
	NSHTTPURLResponse *urlResponse = nil;
	NSError *error = [[NSError alloc] init];
	
	NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];  
	
	// On récupère le résultat.
	NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
	
	[connection release];
	[error release];
	
	// A-t-on pu se déconnecter?
	if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) 
    {
		// FIXME : debug
		NSLog(@"Requête de déconnexion effectuée. Résultat : %@", result);
		
		// FIXME : à améliorer, on ne devrait pas faire de présuppositions sur la typographie, espaces, etc.
		if ([result isEqualToString:@"OK"])
		{
			// Tout s'est bien passé.
			[result release];
			
			return 0;
		}
		
		// Sinon, un problème est survenu.
		[result release];
		
		// TODO : vérifier que les données reçues sont bonnes.
		return -1;
	} 
    else 
    {
		[result release];
		
        // Une erreur est survenue.
		return -1;
    }
	
	[result release];
	
	// Tout s'est bien passé.
	return 0;
}

- (int)disconnectWithAdd {
	NSLog(@"[GatewayConnection] : Ajout de la passerelle de référence dans la BD");
	Gateway * gref = [[DatasTruffle getGateways] objectAtIndex:0];
	gref.ref = 1;
	DAOTruffle * dao = [[DAOTruffle alloc] init];
	[dao addGateway:gref];
	return [self disconnect];
	
}

+(void) setGlobalToken:(NSData *) newToken
{
	tokenDev = newToken;
	
	NSLog(@"token = %@", tokenDev);
}

// Destructeur.
- (void)dealloc
{
	// On appelle le destructeur parent.
    [super dealloc];
	
	// Releases
	[gatewayURL release];
	[position release];
	[token release];
	[latitude release];
	[longitude release];
}

@end
